/*
    2D FDTD simulator
    Copyright (C) 2019 Emilia Blåsten

    This program is free software: you can redistribute it and/or
    modify it under the terms of the GNU Affero General Public License
    as published by the Free Software Foundation, either version 3 of
    the License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public
    License along with this program.  If not, see
    <http://www.gnu.org/licenses/>.
*/
/* abctmz.h: Header file that defines the ABC structure and contains the
 * related prototype functions. It contains the coefficient for updating
 * the second order ABC boundary condition. It also contains pointers to
 * four arrays containing the boundary data on the left, right, top and
 * bottom. */

#ifndef _ABCTMZ_H
#define _ABCTMZ_H

#include "gridtmz.h"

struct Abc {
  double coef0, coef1, coef2;

  double ***ezLeft;
  double **ezLeftTfixed;
  double *ezLeftTOfixed;

  double ***ezRight;
  double **ezRightTfixed;
  double *ezRightTOfixed;

  double ***ezTop;
  double **ezTopTfixed;
  double *ezTopTOfixed;

  double ***ezBottom;
  double **ezBottomTfixed;
  double *ezBottomTOfixed;
};

typedef struct Abc Abc;

Abc *abcCreate(int sizeX, int sizeY);
void abcInit(Abc *ab, Grid *g);
void abcDestroy(Abc *ab);
void abc(Abc *ab, Grid *g);

#endif
